package gui;


import java.lang.reflect.Method;
import java.util.LinkedList;

/*uma declaracao tera um metodo associado, tipos e nomes de entradas, tipo de retorno e ate um cabecalho do metodo*/
public class DeclaracaoDeMetodo //NADA DE NOVO
{
	private Method metodoAssociado;
	@SuppressWarnings("rawtypes")
	private Class[] tiposDosParametrosDeEntrada;
	@SuppressWarnings("rawtypes")
	private Class tipoDeRetorno;
	private LinkedList<String> nomesDosParametrosDeEntrada;
	private String urlParaArquivoJavaQueTemOMetodo;
	private String cabecalhoDoMetodo;
	
	public DeclaracaoDeMetodo(Method metodo, String urlParaArquivoJavaQueTemOMetodo)
	{
		this.metodoAssociado = metodo;
		this.urlParaArquivoJavaQueTemOMetodo = urlParaArquivoJavaQueTemOMetodo;
		this.tiposDosParametrosDeEntrada = this.metodoAssociado.getParameterTypes();
		this.tipoDeRetorno = this.metodoAssociado.getReturnType();
		
		PegaNomesDosParametrosDeUmMetodo pegaNomesDosParametros = 
												new PegaNomesDosParametrosDeUmMetodo();
		try 
		{
			this.nomesDosParametrosDeEntrada = 
					pegaNomesDosParametros.pegarNomesDosParametrosDeUmMetodo
											(metodo, urlParaArquivoJavaQueTemOMetodo);
			formarCabecalhoDoMetodo();
		} 
		catch (NomesDosParametrosNotFoundException e) 
		{
			System.out.println("metodo cujos parametros de entradas nao puderam ser obtidos:" + metodo.getName());
			nomesDosParametrosDeEntrada = new LinkedList<String>();
			this.cabecalhoDoMetodo = "";
		}
		
	}
	
	private void formarCabecalhoDoMetodo()
	{
		//primeiro, o tipo de retorno e um espaco em branco
		this.cabecalhoDoMetodo = this.tipoDeRetorno.getSimpleName() + " ";
		
		//depois, o nome do metodo
		this.cabecalhoDoMetodo = cabecalhoDoMetodo + this.metodoAssociado.getName();
		
		//agora os parenteses com os nomes e tipos dos parametros de entrada
		this.cabecalhoDoMetodo = cabecalhoDoMetodo + "(";
		
		int quantosParametrosTemOMetodo = this.tiposDosParametrosDeEntrada.length;
		for(int i = 0; i < quantosParametrosTemOMetodo; i++)
		{
			System.out.println("nome do metodo=" + cabecalhoDoMetodo);
			System.out.println("quantos parametros tem o metodo=" + quantosParametrosTemOMetodo);
			String parametro = this.nomesDosParametrosDeEntrada.get(i);
			String tipoDoParametro = this.tiposDosParametrosDeEntrada[i].getSimpleName();
			
			if(i == quantosParametrosTemOMetodo - 1)
			{
				this.cabecalhoDoMetodo = cabecalhoDoMetodo + tipoDoParametro + " " + parametro;
			}
			else
			{
				this.cabecalhoDoMetodo = cabecalhoDoMetodo + tipoDoParametro + " " + parametro + ", "; 
			}
		}
		
		this.cabecalhoDoMetodo = cabecalhoDoMetodo + ")";
	}

	public Method getMetodoAssociado() {
		return metodoAssociado;
	}

	public void setMetodoAssociado(Method metodoAssociado) {
		this.metodoAssociado = metodoAssociado;
	}

	@SuppressWarnings("rawtypes")
	public Class[] getTiposDosParametrosDeEntrada() {
		return tiposDosParametrosDeEntrada;
	}

	@SuppressWarnings("rawtypes")
	public void setTiposDosParametrosDeEntrada(Class[] tiposDosParametrosDeEntrada) {
		this.tiposDosParametrosDeEntrada = tiposDosParametrosDeEntrada;
	}

	@SuppressWarnings("rawtypes")
	public Class getTipoDeRetorno() {
		return tipoDeRetorno;
	}

	@SuppressWarnings("rawtypes")
	public void setTipoDeRetorno(Class tipoDeRetorno) {
		this.tipoDeRetorno = tipoDeRetorno;
	}

	public LinkedList<String> getNomesDosParametrosDeEntrada() {
		return nomesDosParametrosDeEntrada;
	}

	public void setNomesDosParametrosDeEntrada(
			LinkedList<String> nomesDosParametrosDeEntrada) {
		this.nomesDosParametrosDeEntrada = nomesDosParametrosDeEntrada;
	}

	public String getCabecalhoDoMetodo() {
		return cabecalhoDoMetodo;
	}

	public void setCabecalhoDoMetodo(String cabecalhoDoMetodo) {
		this.cabecalhoDoMetodo = cabecalhoDoMetodo;
	}

	public String getUrlParaArquivoJavaQueTemOMetodo() {
		return urlParaArquivoJavaQueTemOMetodo;
	}
	
	
	
	
}
